Grand Central Dispatch (GCD) iOS এবং macOS-এ মাল্টি-থ্রেডিং এবং কনকারেন্সি ব্যবস্থাপনার জন্য Apple-এর একটি শক্তিশালী ফ্রেমওয়ার্ক। GCD ব্যবহার করে আমরা সহজেই অ্যাসিনক্রোনাস কাজ করতে পারি, যা অ্যাপের পারফরমেন্স উন্নত করে এবং মেইন থ্রেডকে ব্লক হওয়া থেকে রক্ষা করে। এটি কোডকে বিভিন্ন কিউ (queue) তে পাঠিয়ে এক্সিকিউট করে, যাতে বিভিন্ন কাজ সমান্তরালভাবে বা ধারাবাহিকভাবে সম্পন্ন করা যায়।
GCD কেন ব্যবহার করা হয়?
- অ্যাসিনক্রোনাস প্রসেসিং: GCD দিয়ে কোড অ্যাসিনক্রোনাসভাবে এক্সিকিউট করা যায়, যা মেইন থ্রেডকে ফ্রি রাখে এবং UI এর রেসপন্সিভনেস বাড়ায়।
- ব্যাকগ্রাউন্ড টাস্ক: লং-রানিং টাস্ক (যেমন নেটওয়ার্ক রিকোয়েস্ট, ডেটাবেস অপারেশন) ব্যাকগ্রাউন্ডে চালিয়ে রাখা যায়।
- থ্রেড ম্যানেজমেন্ট: GCD স্বয়ংক্রিয়ভাবে থ্রেড ম্যানেজ করে, তাই ম্যানুয়ালি থ্রেড তৈরি বা ম্যানেজ করার প্রয়োজন হয় না।
GCD কিউ টাইপস
GCD-তে দুটি প্রধান ধরনের কিউ রয়েছে:
- Serial Queue: এই কিউ তে কাজগুলো একটির পর একটি ধারাবাহিকভাবে এক্সিকিউট হয়।
- Concurrent Queue: এই কিউ তে কাজগুলো একাধিক থ্রেডে সমান্তরালে এক্সিকিউট হয়, ফলে একাধিক কাজ একই সাথে চালানো সম্ভব।
Main Queue
- Main Queue একটি বিশেষ Serial Queue যা মেইন থ্রেডে চলে এবং সব UI রিলেটেড কাজ এখানে করা হয়।
- উদাহরণ:
DispatchQueue.main.async {
// UI রিলেটেড কাজ, যেমন লেবেল আপডেট বা ভিউ পরিবর্তন
}
Global Queue
- Global Queue হলো Concurrent Queue যা ব্যাকগ্রাউন্ড টাস্কের জন্য ব্যবহৃত হয়। এটি বিভিন্ন QoS (Quality of Service) লেভেলে কাজ করে:
- userInteractive: মেইন থ্রেডে দ্রুত কাজ করতে হয় এমন টাস্কের জন্য।
- userInitiated: ইউজার-ইনিশিয়েটেড কাজ যা দ্রুত করতে হয়।
- utility: লং-রানিং টাস্ক, যেমন ফাইল ডাউনলোড বা ডেটা প্রসেসিং।
- background: ব্যাকগ্রাউন্ডে কম গুরুত্বপূর্ণ কাজের জন্য।
GCD ব্যবহার করার উদাহরণ
১. অ্যাসিনক্রোনাসভাবে কাজ চালানো
DispatchQueue.global().async {
// ব্যাকগ্রাউন্ডে একটি কাজ করা
print("This is running in the background")
// মেইন থ্রেডে ফিরে UI আপডেট করা
DispatchQueue.main.async {
print("This is running on the main thread")
}
}
- DispatchQueue.global().async ব্যবহার করে একটি টাস্ক ব্যাকগ্রাউন্ডে চালানো হয়েছে।
- তারপর DispatchQueue.main.async দিয়ে UI রিলেটেড কাজ মেইন থ্রেডে করা হয়েছে।
২. ডিলে (Delay) করে কাজ করা
GCD দিয়ে একটি নির্দিষ্ট সময় পর কাজ এক্সিকিউট করা যায়:
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
print("This will run after 2 seconds")
}
- এখানে asyncAfter ব্যবহার করে ২ সেকেন্ড পরে কাজ এক্সিকিউট করা হয়েছে।
৩. Custom Serial Queue তৈরি করা
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
print("Task 1")
}
serialQueue.async {
print("Task 2")
}
- DispatchQueue(label:) ব্যবহার করে একটি Custom Serial Queue তৈরি করা হয়েছে, যেখানে কাজগুলো ক্রমানুসারে এক্সিকিউট হবে।
৪. Custom Concurrent Queue তৈরি করা
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
concurrentQueue.async {
print("Task 1")
}
concurrentQueue.async {
print("Task 2")
}
- এখানে .concurrent অ্যাট্রিবিউট ব্যবহার করে একটি Concurrent Queue তৈরি করা হয়েছে। এই কিউতে কাজগুলো সমান্তরালে এক্সিকিউট হবে।
Dispatch Group
Dispatch Group ব্যবহার করে একাধিক অ্যাসিনক্রোনাস টাস্ককে গ্রুপ করা যায় এবং সব টাস্ক শেষ হলে একটি কাজ এক্সিকিউট করা যায়।
Dispatch Group এর উদাহরণ
let group = DispatchGroup()
group.enter()
DispatchQueue.global().async {
// Task 1
print("Task 1 started")
sleep(2) // Task duration simulation
print("Task 1 finished")
group.leave()
}
group.enter()
DispatchQueue.global().async {
// Task 2
print("Task 2 started")
sleep(3) // Task duration simulation
print("Task 2 finished")
group.leave()
}
// সব টাস্ক শেষ হলে কলব্যাক
group.notify(queue: DispatchQueue.main) {
print("All tasks are completed")
}
- DispatchGroup এর মাধ্যমে দুটি অ্যাসিনক্রোনাস টাস্ক গ্রুপ করা হয়েছে।
- group.enter() এবং group.leave() ব্যবহার করে টাস্কের শুরু এবং শেষ নির্ধারণ করা হয়েছে।
- group.notify দিয়ে সব টাস্ক শেষ হওয়ার পর মেইন থ্রেডে একটি কাজ এক্সিকিউট করা হয়েছে।
Dispatch Barrier
Dispatch Barrier ব্যবহার করে Concurrent Queue-তে ক্রিটিক্যাল সেকশন তৈরি করা যায়, যেখানে এক সময় একটিমাত্র টাস্ক এক্সিকিউট হবে।
Dispatch Barrier এর উদাহরণ
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
concurrentQueue.async {
print("Task 1")
}
concurrentQueue.async(flags: .barrier) {
print("This is a barrier task")
}
concurrentQueue.async {
print("Task 2")
}
- .barrier ফ্ল্যাগ ব্যবহার করে একটি Barrier Task তৈরি করা হয়েছে। এটি অন্য সব টাস্ক বন্ধ করে একা এক্সিকিউট হয়।
Dispatch Semaphore
Dispatch Semaphore ব্যবহার করে কনকারেন্ট এক্সিকিউশন কন্ট্রোল করা যায়। এটি থ্রেড সিঙ্ক্রোনাইজেশন করতে ব্যবহৃত হয়।
Dispatch Semaphore এর উদাহরণ
let semaphore = DispatchSemaphore(value: 1)
DispatchQueue.global().async {
semaphore.wait()
print("Task 1 started")
sleep(2)
print("Task 1 finished")
semaphore.signal()
}
DispatchQueue.global().async {
semaphore.wait()
print("Task 2 started")
sleep(1)
print("Task 2 finished")
semaphore.signal()
}
- DispatchSemaphore দিয়ে দুটি টাস্কের সিঙ্ক্রোনাইজেশন করা হয়েছে যাতে একটি টাস্ক শেষ না হওয়া পর্যন্ত অন্যটি শুরু না হয়।
উপসংহার
- GCD একটি শক্তিশালী টুল যা iOS এবং macOS অ্যাপ্লিকেশন ডেভেলপমেন্টে মাল্টি-থ্রেডিং ম্যানেজ করতে ব্যবহৃত হয়।
- Serial এবং Concurrent Queue, Dispatch Group, Barrier, এবং Semaphore এর মাধ্যমে সহজে অ্যাসিনক্রোনাস প্রোগ্রামিং করা যায়।
- GCD ব্যবহার করে অ্যাপের পারফরমেন্স উন্নত করা এবং UI রেসপন্সিভ রাখা যায়।
Read more